package kr.pe.johnkim.checkmileage.mobile.rest.service;

import kr.pe.johnkim.checkmileage.mobile.domain.CheckMileageMileage;

import java.util.List;

/**
 * Check Mileage 마일리지 관련 Service 기능들을 정의하는 인터페이스 이다.
 * 
 * @author : johnkim <cale9797@gmail.com / Bettersoft, Inc.>
 * @Date : 12. 7. 25
 */
public interface CheckMileageMileageService {

    /**
     * 기존에 등록된 마일리지가 있는지 확인 한다.
     * @param checkMileageMileage
     * @return
     */
    public  CheckMileageMileage checkMileageExist(CheckMileageMileage checkMileageMileage);

    /**
     * 기존에 가맹점에 등록된 사용자의 마일리지를 가져 온다.
     *
     * @param checkMileageMileage
     * @return
     */
    public CheckMileageMileage selectMemberMileage(CheckMileageMileage checkMileageMileage);

    /**
     * 마일리지를 등록 한다.
     *
     * 1. 마일리지 등록에 성공하면 로그도 등록한다.
     * 2. 같은 transaction 으로 묶는다.
     *
     * @param checkMileageMileage
     * @return
     */
    public void registerMileage(CheckMileageMileage checkMileageMileage) throws Exception;

    /**
     * 마일리지 점수를 업데이트 한다.
     *
     * 1. 마일리지 업데이트에 성공하면 로그도 등록한다.
     * 2. 같은 transaction 으로 묶는다.
     *
     * @param checkMileageMileage
     * @return
     */
    public void updateMileage(CheckMileageMileage checkMileageMileage) throws Exception;

    /**
     * 사용자의 마일리지 목록을 가져 온다. 사용자 smart phone 에 출력.
     *
     * @param checkMileageMileage
     * @return
     */
    public List<CheckMileageMileage> selectMemberMerchantMileageList(CheckMileageMileage checkMileageMileage);

    /**
     * 가맹점 고객의 마일리지 목록을 가져 온다. 가맹점 tablet PC/iPad 에 출력.
     *
     * @param checkMileageMileage
     * @return
     */
    public List<CheckMileageMileage> selectMerchantMemberMileageList(CheckMileageMileage checkMileageMileage);

    /**
     * 마일리지를 비활성화 한다. 사용자가 서비스 탈퇴 시 관련 정보 비활성화.
     *
     * @param checkMileageMileage
     */
    public void updateDeactivateMileage(CheckMileageMileage checkMileageMileage);

    /**
     * 사용자의 가장 최근에 등록된 마일리지 아이디를 가져 온다.
     *
     * @param checkMileageMileage
     * @return
     */
    public CheckMileageMileage selectMileageId(CheckMileageMileage checkMileageMileage);
}
